{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Manipulating word embeddings \n",
    "\n",
    "In this week's assignment, you are going to use a pre-trained word embedding for finding word analogies and equivalence. This exercise can be used as an Intrinsic Evaluation for the word embedding performance. In this notebook, you will apply linear algebra operations using NumPy to find analogies between words manually. This will help you to prepare for this week's assignment."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "243"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd # Library for Dataframes \n",
    "import numpy as np # Library for math functions\n",
    "import pickle # Python object serialization library. Not secure\n",
    "\n",
    "word_embeddings = pickle.load( open( \"word_embeddings_subset.p\", \"rb\" ) )\n",
    "len(word_embeddings) # there should be 243 words that will be used in this assignment"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now that the model is loaded, we can take a look at the word representations. First, note that the _word_embeddings_ is a dictionary. Each word is the key to the entry, and the value is its corresponding vector presentation. Remember that square brackets allow access to any entry if the key exists. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'numpy.ndarray'>\n",
      "[-0.08007812  0.13378906  0.14355469  0.09472656 -0.04736328 -0.02355957\n",
      " -0.00854492 -0.18652344  0.04589844 -0.08154297 -0.03442383 -0.11621094\n",
      "  0.21777344 -0.10351562 -0.06689453  0.15332031 -0.19335938  0.26367188\n",
      " -0.13671875 -0.05566406  0.07470703 -0.00070953  0.09375    -0.14453125\n",
      "  0.04296875 -0.01916504 -0.22558594 -0.12695312 -0.0168457   0.05224609\n",
      "  0.0625     -0.1484375  -0.01965332  0.17578125  0.10644531 -0.04760742\n",
      " -0.10253906 -0.28515625  0.10351562  0.20800781 -0.07617188 -0.04345703\n",
      "  0.08642578  0.08740234  0.11767578  0.20996094 -0.07275391  0.1640625\n",
      " -0.01135254  0.0025177   0.05810547 -0.03222656  0.06884766  0.046875\n",
      "  0.10107422  0.02148438 -0.16210938  0.07128906 -0.16210938  0.05981445\n",
      "  0.05102539 -0.05566406  0.06787109 -0.03759766  0.04345703 -0.03173828\n",
      " -0.03417969 -0.01116943  0.06201172 -0.08007812 -0.14941406  0.11914062\n",
      "  0.02575684  0.00302124  0.04711914 -0.17773438  0.04101562  0.05541992\n",
      "  0.00598145  0.03027344 -0.07666016 -0.109375    0.02832031 -0.10498047\n",
      "  0.0100708  -0.03149414 -0.22363281 -0.03125    -0.01147461  0.17285156\n",
      "  0.08056641 -0.10888672 -0.09570312 -0.21777344 -0.07910156 -0.10009766\n",
      "  0.06396484 -0.11962891  0.18652344 -0.02062988 -0.02172852  0.29296875\n",
      " -0.00793457  0.0324707  -0.15136719  0.00227356 -0.03540039 -0.13378906\n",
      "  0.0546875  -0.03271484 -0.01855469 -0.10302734 -0.13378906  0.11425781\n",
      "  0.16699219  0.01361084 -0.02722168 -0.2109375   0.07177734  0.08691406\n",
      " -0.09960938  0.01422119 -0.18261719  0.00741577  0.01965332  0.00738525\n",
      " -0.03271484 -0.15234375 -0.26367188 -0.14746094  0.03320312 -0.03344727\n",
      " -0.01000977  0.01855469  0.00183868 -0.10498047  0.09667969  0.07910156\n",
      "  0.11181641  0.13085938 -0.08740234 -0.1328125   0.05004883  0.19824219\n",
      "  0.0612793   0.16210938  0.06933594  0.01281738  0.01550293  0.01531982\n",
      "  0.11474609  0.02758789  0.13769531 -0.08349609  0.01123047 -0.20507812\n",
      " -0.12988281 -0.16699219  0.20410156 -0.03588867 -0.10888672  0.0534668\n",
      "  0.15820312 -0.20410156  0.14648438 -0.11572266  0.01855469 -0.13574219\n",
      "  0.24121094  0.12304688 -0.14550781  0.17578125  0.11816406 -0.30859375\n",
      "  0.10888672 -0.22363281  0.19335938 -0.15722656 -0.07666016 -0.09082031\n",
      " -0.19628906 -0.23144531 -0.09130859 -0.14160156  0.06347656  0.03344727\n",
      " -0.03369141  0.06591797  0.06201172  0.3046875   0.16796875 -0.11035156\n",
      " -0.03833008 -0.02563477 -0.09765625  0.04467773 -0.0534668   0.11621094\n",
      " -0.15039062 -0.16308594 -0.15527344  0.04638672  0.11572266 -0.06640625\n",
      " -0.04516602  0.02331543 -0.08105469 -0.0255127  -0.07714844  0.0016861\n",
      "  0.15820312  0.00994873 -0.06445312  0.15722656 -0.03112793  0.10644531\n",
      " -0.140625    0.23535156 -0.11279297  0.16015625  0.00061798 -0.1484375\n",
      "  0.02307129 -0.109375    0.05444336 -0.14160156  0.11621094  0.03710938\n",
      "  0.14746094 -0.04199219 -0.01391602 -0.03881836  0.02783203  0.10205078\n",
      "  0.07470703  0.20898438 -0.04223633 -0.04150391 -0.00588989 -0.14941406\n",
      " -0.04296875 -0.10107422 -0.06176758  0.09472656  0.22265625 -0.02307129\n",
      "  0.04858398 -0.15527344 -0.02282715 -0.04174805  0.16699219 -0.09423828\n",
      "  0.14453125  0.11132812  0.04223633 -0.16699219  0.10253906  0.16796875\n",
      "  0.12597656 -0.11865234 -0.0213623  -0.08056641  0.24316406  0.15527344\n",
      "  0.16503906  0.00854492 -0.12255859  0.08691406 -0.11914062 -0.02941895\n",
      "  0.08349609 -0.03100586  0.13964844 -0.05151367  0.00765991 -0.04443359\n",
      " -0.04980469 -0.03222656 -0.00952148 -0.10888672 -0.10302734 -0.15722656\n",
      "  0.19335938  0.04858398  0.015625   -0.08105469 -0.11621094 -0.01989746\n",
      "  0.05737305  0.06103516 -0.14550781  0.06738281 -0.24414062 -0.07714844\n",
      "  0.04760742 -0.07519531 -0.14941406 -0.04418945  0.09716797  0.06738281]\n"
     ]
    }
   ],
   "source": [
    "countryVector = word_embeddings['country'] # Get the vector representation for the word 'country'\n",
    "print(type(countryVector)) # Print the type of the vector. Note it is a numpy array\n",
    "print(countryVector) # Print the values of the vector.  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "It is important to note that we store each vector as a NumPy array. It allows us to use the linear algebra operations on it. \n",
    "\n",
    "The vectors have a size of 300, while the vocabulary size of Google News is around 3 million words! "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "#Get the vector for a given word:\n",
    "def vec(w):\n",
    "    return word_embeddings[w]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Operating on word embeddings\n",
    "\n",
    "Remember that understanding the data is one of the most critical steps in Data Science. Word embeddings are the result of machine learning processes and will be part of the input for further processes. These word embedding needs to be validated or at least understood because the performance of the derived model will strongly depend on its quality.\n",
    "\n",
    "Word embeddings are multidimensional arrays, usually with hundreds of attributes that pose a challenge for its interpretation. \n",
    "\n",
    "In this notebook, we will visually inspect the word embedding of some words using a pair of attributes. Raw attributes are not the best option for the creation of such charts but will allow us to illustrate the mechanical part in Python. \n",
    "\n",
    "In the next cell, we make a beautiful plot for the word embeddings of some words. Even if plotting the dots gives an idea of the words, the arrow representations help to visualize the vector's alignment as well."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 1000x1000 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt # Import matplotlib\n",
    "\n",
    "words = ['oil', 'gas', 'happy', 'sad', 'city', 'town', 'village', 'country', 'continent', 'petroleum', 'joyful']\n",
    "\n",
    "bag2d = np.array([vec(word) for word in words]) # Convert each word to its vector representation\n",
    "\n",
    "fig, ax = plt.subplots(figsize = (10, 10)) # Create custom size image\n",
    "\n",
    "col1 = 3 # Select the column for the x axis\n",
    "col2 = 2 # Select the column for the y axis\n",
    "\n",
    "# Print an arrow for each word\n",
    "for word in bag2d:\n",
    "    ax.arrow(0, 0, word[col1], word[col2], head_width=0.005, head_length=0.005, fc='r', ec='r', width = 1e-5)\n",
    "\n",
    "    \n",
    "ax.scatter(bag2d[:, col1], bag2d[:, col2]); # Plot a dot for each word\n",
    "\n",
    "# Add the word label over each dot in the scatter plot\n",
    "for i in range(0, len(words)):\n",
    "    ax.annotate(words[i], (bag2d[i, col1], bag2d[i, col2]))\n",
    "\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Note that similar words like 'village' and 'town' or 'petroleum', 'oil', and 'gas' tend to point in the same direction. Also, note that 'sad' and 'happy' looks close to each other; however, the vectors point in opposite directions.\n",
    "\n",
    "In this chart, one can figure out the angles and distances between the words. Some words are close in both kinds of distance metrics."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Word distance\n",
    "\n",
    "Now plot the words 'sad', 'happy', 'town', and 'village'. In this same chart, display the vector from 'village' to 'town' and the vector from 'sad' to 'happy'. Let us use NumPy for these linear algebra operations."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAl0AAAJCCAYAAAD6AnJlAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzs3Xd4FNX6B/DvyYbQAoQuBIQoXDSAtEAQBaWDekFUigURUYo38BOkKiiiSESRKyjFQrsgUo2oNAFRQBBCU6oKIgSDhI70Mr8/3gyLMSGbZGbO7O738zw872QzO/ONNzd5M3PmHGUYBoiIiIjIXiG6AxAREREFAzZdRERERA5g00VERETkADZdRERERA5g00VERETkADZdRERERA5g00VERETkADZdRERERA5g00VERETkgFDdAdJTrFgxo3z58rpjEBEREWVq48aNRwzDKJ7Zfj41XUqpFgDeBeAB8JFhGPFpPn8bgMkAagJ4yTCMt319b3rKly+PxMREX6IRERERaaWU+t2X/TK9vaiU8gB4H0BLANEAHlVKRafZ7RiAXgDezsZ7iYiIiAKeL2O66gD41TCMvYZhXATwKYDW1+9gGMZhwzA2ALiU1fcSERERBQNfmq5IAAeu+zgp9TVf+PxepVRXpVSiUioxJSXFx8MTERER+Qdfmi6VzmuGj8f3+b2GYXxgGEaMYRgxxYtnOhaNiIiIyK/40nQlASh73cdlAPzh4/Fz8l4iIiKigOFL07UBQEWlVJRSKgxABwALfDx+Tt5LREREFDAynTLCMIzLSqk4AEsg0z5MMgxju1Kqe+rnJyilbgKQCKAggKtKqecBRBuGcSq999r1xRARERG5lTIMX4dnOScmJsbgPF1ERETkD5RSGw3DiMlsPy4DREREROQANl1EREREDmDTRUREROQANl1EREREDmDTRUREROQANl1EREREDmDTRUREROQANl1EREREDmDTRUREROQANl1EREREDmDTRUREROQANl1EREREDmDTRUREROQANl1EREREDmDTRUREROQANl1EREREDmDTRUREROQANl1EREREDmDTRUREROQANl1EREREDmDTRUREROQANl1EREREDmDTRUREROQANl1EREREDmDTRUREROQANl1EREREDmDTRUREROQANl1EREREDmDTRUREROQANl1EREREDmDTRUREROQANl1EREREDmDTRUREROQANl1EREREDmDTRUREROQANl3Z9Mcff+CRRx4BAKxcuRIPPPAAAGDKlCmIi4vTGY2IiIhciE1XNpUuXRpz587VHYOIiIj8BJsuHwwYMADjxo279vHQoUMxatQoVKlS5Ybv++KLLxAbG4saNWqgSZMm+PPPPwEAKSkpaNq0KWrWrIlu3bqhXLlyOHLkCABg+vTpqFOnDqpXr45u3brhypUr9n1hRERE5Bg2XT7o0KEDZs2ade3j2bNno3bt2pm+7+6778a6deuwefNmdOjQASNHjgQAvPrqq2jUqBE2bdqENm3aYP/+/QCAnTt3YtasWVizZg22bNkCj8eDGTNm2PNFERERkaNCdQdws4TNB/HWkt3448Q5/LlzHyYt3YhaJUNRuHBh3HzzzZm+PykpCe3bt0dycjIuXryIqKgoAMDq1avx2WefAQBatGiBwoULAwCWL1+OjRs3Xmvozp07hxIlStj01REREZGT2HRlIGHzQcTP+B7V9mzBkVtqIazCnRg06iPUjwxFhw4dfDpGz5490adPH7Rq1QorV67E0KFDAQCGYaS7v2EY6NSpE0aMGGHVl0FEREQuwduLGXhryW48/d1MTEx4A613fIt8tzfAyW0r8dWCz649tZiZkydPIjIyEgAwderUa6/ffffdmD17NgBg6dKlOH78OACgcePGmDt3Lg4fPgwAOHbsGH7//XcrvywiIiLShE1XBv44cQ6romogN87jt8V3o2BESVy9eA7IXwSlSpXy6RhDhw5F27ZtUb9+fRQrVuza66+88gqWLl2KmjVrYtGiRShVqhQKFCiA6OhovP7662jWrBnuuOMONG3aFMnJyXZ9iUREROQgldGtLp1iYmKMxMRErRnuil+BQ8f+QvR7l/HluYdgQOFfL3yG4sUKYs3ARjk69oULF+DxeBAaGoq1a9eiR48e2LJli0XJiYiIyElKqY2GYcRkth/HdGWgX/NKGDT/J2ztHgaMBlagIX4e1Qaf//Bbjo+9f/9+tGvXDlevXkVYWBg+/PBDCxITERGRm7HpysCDNWQs1ltLduMAgCYhy3D1qgetY6OAy5cBjyfbx65YsSI2b95sUVIiIiLyBxzTdQMP1ojEmoGNMG4cYFwNwdU/DsknQkOBq1f1hiMiIiK/wqbL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\n",
      "text/plain": [
       "<Figure size 720x720 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "words = ['sad', 'happy', 'town', 'village']\n",
    "\n",
    "bag2d = np.array([vec(word) for word in words]) # Convert each word to its vector representation\n",
    "\n",
    "fig, ax = plt.subplots(figsize = (10, 10)) # Create custom size image\n",
    "\n",
    "col1 = 3 # Select the column for the x axe\n",
    "col2 = 2 # Select the column for the y axe\n",
    "\n",
    "# Print an arrow for each word\n",
    "for word in bag2d:\n",
    "    ax.arrow(0, 0, word[col1], word[col2], head_width=0.0005, head_length=0.0005, fc='r', ec='r', width = 1e-5)\n",
    "    \n",
    "# print the vector difference between village and town\n",
    "village = vec('village')\n",
    "town = vec('town')\n",
    "diff = town - village\n",
    "ax.arrow(village[col1], village[col2], diff[col1], diff[col2], fc='b', ec='b', width = 1e-5)\n",
    "\n",
    "# print the vector difference between village and town\n",
    "sad = vec('sad')\n",
    "happy = vec('happy')\n",
    "diff = happy - sad\n",
    "ax.arrow(sad[col1], sad[col2], diff[col1], diff[col2], fc='b', ec='b', width = 1e-5)\n",
    "\n",
    "\n",
    "ax.scatter(bag2d[:, col1], bag2d[:, col2]); # Plot a dot for each word\n",
    "\n",
    "# Add the word label over each dot in the scatter plot\n",
    "for i in range(0, len(words)):\n",
    "    ax.annotate(words[i], (bag2d[i, col1], bag2d[i, col2]))\n",
    "\n",
    "\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Linear algebra on word embeddings\n",
    "\n",
    "In the lectures, we saw the analogies between words using algebra on word embeddings. Let us see how to do it in Python with Numpy.\n",
    "\n",
    "To start, get the **norm** of a word in the word embedding."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2.3858097\n",
      "2.9004838\n"
     ]
    }
   ],
   "source": [
    "print(np.linalg.norm(vec('town'))) # Print the norm of the word town\n",
    "print(np.linalg.norm(vec('sad'))) # Print the norm of the word sad"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Predicting capitals\n",
    "\n",
    "Now, applying vector difference and addition, one can create a vector representation for a new word. For example, we can say that the vector difference between 'France' and 'Paris' represents the concept of Capital.\n",
    "\n",
    "One can move from the city of Madrid in the direction of the concept of Capital, and obtain something close to the corresponding country to which Madrid is the Capital."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[-0.02905273 -0.2475586   0.53952026  0.20581055 -0.14862823]\n"
     ]
    }
   ],
   "source": [
    "capital = vec('France') - vec('Paris')\n",
    "country = vec('Madrid') + capital\n",
    "\n",
    "print(country[0:5]) # Print the first 5 values of the vector"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can observe that the vector 'country' that we expected to be the same as the vector for Spain is not exactly it."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[-0.06054688 -0.06494141  0.37643433  0.08129883 -0.13007355 -0.00952148\n",
      " -0.03417969 -0.00708008  0.09790039 -0.01867676]\n"
     ]
    }
   ],
   "source": [
    "diff = country - vec('Spain')\n",
    "print(diff[0:10])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "So, we have to look for the closest words in the embedding that matches the candidate country. If the word embedding works as expected, the most similar word must be 'Spain'. Let us define a function that helps us to do it. We will store our word embedding as a DataFrame, which facilitate the lookup operations based on the numerical vectors."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Create a dataframe out of the dictionary embedding. This facilitate the algebraic operations\n",
    "keys = word_embeddings.keys()\n",
    "data = []\n",
    "for key in keys:\n",
    "    data.append(word_embeddings[key])\n",
    "\n",
    "embedding = pd.DataFrame(data=data, index=keys)\n",
    "# Define a function to find the closest word to a vector:\n",
    "def find_closest_word(v, k = 1):\n",
    "    # Calculate the vector difference from each word to the input vector\n",
    "    diff = embedding.values - v \n",
    "    # Get the norm of each difference vector. \n",
    "    # It means the squared euclidean distance from each word to the input vector\n",
    "    delta = np.sum(diff * diff, axis=1)\n",
    "    # Find the index of the minimun distance in the array\n",
    "    i = np.argmin(delta)\n",
    "    # Return the row name for this item\n",
    "    return embedding.iloc[i].name\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "      <th>4</th>\n",
       "      <th>5</th>\n",
       "      <th>6</th>\n",
       "      <th>7</th>\n",
       "      <th>8</th>\n",
       "      <th>9</th>\n",
       "      <th>...</th>\n",
       "      <th>290</th>\n",
       "      <th>291</th>\n",
       "      <th>292</th>\n",
       "      <th>293</th>\n",
       "      <th>294</th>\n",
       "      <th>295</th>\n",
       "      <th>296</th>\n",
       "      <th>297</th>\n",
       "      <th>298</th>\n",
       "      <th>299</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>country</th>\n",
       "      <td>-0.080078</td>\n",
       "      <td>0.133789</td>\n",
       "      <td>0.143555</td>\n",
       "      <td>0.094727</td>\n",
       "      <td>-0.047363</td>\n",
       "      <td>-0.023560</td>\n",
       "      <td>-0.008545</td>\n",
       "      <td>-0.186523</td>\n",
       "      <td>0.045898</td>\n",
       "      <td>-0.081543</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.145508</td>\n",
       "      <td>0.067383</td>\n",
       "      <td>-0.244141</td>\n",
       "      <td>-0.077148</td>\n",
       "      <td>0.047607</td>\n",
       "      <td>-0.075195</td>\n",
       "      <td>-0.149414</td>\n",
       "      <td>-0.044189</td>\n",
       "      <td>0.097168</td>\n",
       "      <td>0.067383</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>city</th>\n",
       "      <td>-0.010071</td>\n",
       "      <td>0.057373</td>\n",
       "      <td>0.183594</td>\n",
       "      <td>-0.040039</td>\n",
       "      <td>-0.029785</td>\n",
       "      <td>-0.079102</td>\n",
       "      <td>0.071777</td>\n",
       "      <td>0.013306</td>\n",
       "      <td>-0.143555</td>\n",
       "      <td>0.011292</td>\n",
       "      <td>...</td>\n",
       "      <td>0.024292</td>\n",
       "      <td>-0.168945</td>\n",
       "      <td>-0.062988</td>\n",
       "      <td>0.117188</td>\n",
       "      <td>-0.020508</td>\n",
       "      <td>0.030273</td>\n",
       "      <td>-0.247070</td>\n",
       "      <td>-0.122559</td>\n",
       "      <td>0.076172</td>\n",
       "      <td>-0.234375</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>China</th>\n",
       "      <td>-0.073242</td>\n",
       "      <td>0.135742</td>\n",
       "      <td>0.108887</td>\n",
       "      <td>0.083008</td>\n",
       "      <td>-0.127930</td>\n",
       "      <td>-0.227539</td>\n",
       "      <td>0.151367</td>\n",
       "      <td>-0.045654</td>\n",
       "      <td>-0.065430</td>\n",
       "      <td>0.034424</td>\n",
       "      <td>...</td>\n",
       "      <td>0.140625</td>\n",
       "      <td>0.087402</td>\n",
       "      <td>0.152344</td>\n",
       "      <td>0.079590</td>\n",
       "      <td>0.006348</td>\n",
       "      <td>-0.037842</td>\n",
       "      <td>-0.183594</td>\n",
       "      <td>0.137695</td>\n",
       "      <td>0.093750</td>\n",
       "      <td>-0.079590</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Iraq</th>\n",
       "      <td>0.191406</td>\n",
       "      <td>0.125000</td>\n",
       "      <td>-0.065430</td>\n",
       "      <td>0.060059</td>\n",
       "      <td>-0.285156</td>\n",
       "      <td>-0.102539</td>\n",
       "      <td>0.117188</td>\n",
       "      <td>-0.351562</td>\n",
       "      <td>-0.095215</td>\n",
       "      <td>0.200195</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.100586</td>\n",
       "      <td>-0.077148</td>\n",
       "      <td>-0.123047</td>\n",
       "      <td>0.193359</td>\n",
       "      <td>-0.153320</td>\n",
       "      <td>0.089355</td>\n",
       "      <td>-0.173828</td>\n",
       "      <td>-0.054688</td>\n",
       "      <td>0.302734</td>\n",
       "      <td>0.105957</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>oil</th>\n",
       "      <td>-0.139648</td>\n",
       "      <td>0.062256</td>\n",
       "      <td>-0.279297</td>\n",
       "      <td>0.063965</td>\n",
       "      <td>0.044434</td>\n",
       "      <td>-0.154297</td>\n",
       "      <td>-0.184570</td>\n",
       "      <td>-0.498047</td>\n",
       "      <td>0.047363</td>\n",
       "      <td>0.110840</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.195312</td>\n",
       "      <td>-0.345703</td>\n",
       "      <td>0.217773</td>\n",
       "      <td>-0.091797</td>\n",
       "      <td>0.051025</td>\n",
       "      <td>0.061279</td>\n",
       "      <td>0.194336</td>\n",
       "      <td>0.204102</td>\n",
       "      <td>0.235352</td>\n",
       "      <td>-0.051025</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>town</th>\n",
       "      <td>0.123535</td>\n",
       "      <td>0.159180</td>\n",
       "      <td>0.030029</td>\n",
       "      <td>-0.161133</td>\n",
       "      <td>0.015625</td>\n",
       "      <td>0.111816</td>\n",
       "      <td>0.039795</td>\n",
       "      <td>-0.196289</td>\n",
       "      <td>-0.039307</td>\n",
       "      <td>0.067871</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.007935</td>\n",
       "      <td>-0.091797</td>\n",
       "      <td>-0.265625</td>\n",
       "      <td>0.029297</td>\n",
       "      <td>0.089844</td>\n",
       "      <td>-0.049805</td>\n",
       "      <td>-0.202148</td>\n",
       "      <td>-0.079590</td>\n",
       "      <td>0.068848</td>\n",
       "      <td>-0.164062</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Canada</th>\n",
       "      <td>-0.136719</td>\n",
       "      <td>-0.154297</td>\n",
       "      <td>0.269531</td>\n",
       "      <td>0.273438</td>\n",
       "      <td>0.086914</td>\n",
       "      <td>-0.076172</td>\n",
       "      <td>-0.018677</td>\n",
       "      <td>0.006256</td>\n",
       "      <td>0.077637</td>\n",
       "      <td>-0.211914</td>\n",
       "      <td>...</td>\n",
       "      <td>0.105469</td>\n",
       "      <td>0.030762</td>\n",
       "      <td>-0.039307</td>\n",
       "      <td>0.183594</td>\n",
       "      <td>-0.117676</td>\n",
       "      <td>0.191406</td>\n",
       "      <td>0.074219</td>\n",
       "      <td>0.020996</td>\n",
       "      <td>0.285156</td>\n",
       "      <td>-0.257812</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>London</th>\n",
       "      <td>-0.267578</td>\n",
       "      <td>0.092773</td>\n",
       "      <td>-0.238281</td>\n",
       "      <td>0.115234</td>\n",
       "      <td>-0.006836</td>\n",
       "      <td>0.221680</td>\n",
       "      <td>-0.251953</td>\n",
       "      <td>-0.055420</td>\n",
       "      <td>0.020020</td>\n",
       "      <td>0.149414</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.008667</td>\n",
       "      <td>-0.008484</td>\n",
       "      <td>-0.053223</td>\n",
       "      <td>0.197266</td>\n",
       "      <td>-0.296875</td>\n",
       "      <td>0.064453</td>\n",
       "      <td>0.091797</td>\n",
       "      <td>0.058350</td>\n",
       "      <td>0.022583</td>\n",
       "      <td>-0.101074</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>England</th>\n",
       "      <td>-0.198242</td>\n",
       "      <td>0.115234</td>\n",
       "      <td>0.062500</td>\n",
       "      <td>-0.058350</td>\n",
       "      <td>0.226562</td>\n",
       "      <td>0.045898</td>\n",
       "      <td>-0.062256</td>\n",
       "      <td>-0.202148</td>\n",
       "      <td>0.080566</td>\n",
       "      <td>0.021606</td>\n",
       "      <td>...</td>\n",
       "      <td>0.135742</td>\n",
       "      <td>0.109375</td>\n",
       "      <td>-0.121582</td>\n",
       "      <td>0.008545</td>\n",
       "      <td>-0.171875</td>\n",
       "      <td>0.086914</td>\n",
       "      <td>0.070312</td>\n",
       "      <td>0.003281</td>\n",
       "      <td>0.069336</td>\n",
       "      <td>0.056152</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Australia</th>\n",
       "      <td>0.048828</td>\n",
       "      <td>-0.194336</td>\n",
       "      <td>-0.041504</td>\n",
       "      <td>0.084473</td>\n",
       "      <td>-0.114258</td>\n",
       "      <td>-0.208008</td>\n",
       "      <td>-0.164062</td>\n",
       "      <td>-0.269531</td>\n",
       "      <td>0.079102</td>\n",
       "      <td>0.275391</td>\n",
       "      <td>...</td>\n",
       "      <td>0.021118</td>\n",
       "      <td>0.171875</td>\n",
       "      <td>0.042236</td>\n",
       "      <td>0.221680</td>\n",
       "      <td>-0.239258</td>\n",
       "      <td>-0.106934</td>\n",
       "      <td>0.030884</td>\n",
       "      <td>0.006622</td>\n",
       "      <td>0.051270</td>\n",
       "      <td>-0.135742</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>10 rows × 300 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "                0         1         2         3         4         5    \\\n",
       "country   -0.080078  0.133789  0.143555  0.094727 -0.047363 -0.023560   \n",
       "city      -0.010071  0.057373  0.183594 -0.040039 -0.029785 -0.079102   \n",
       "China     -0.073242  0.135742  0.108887  0.083008 -0.127930 -0.227539   \n",
       "Iraq       0.191406  0.125000 -0.065430  0.060059 -0.285156 -0.102539   \n",
       "oil       -0.139648  0.062256 -0.279297  0.063965  0.044434 -0.154297   \n",
       "town       0.123535  0.159180  0.030029 -0.161133  0.015625  0.111816   \n",
       "Canada    -0.136719 -0.154297  0.269531  0.273438  0.086914 -0.076172   \n",
       "London    -0.267578  0.092773 -0.238281  0.115234 -0.006836  0.221680   \n",
       "England   -0.198242  0.115234  0.062500 -0.058350  0.226562  0.045898   \n",
       "Australia  0.048828 -0.194336 -0.041504  0.084473 -0.114258 -0.208008   \n",
       "\n",
       "                6         7         8         9    ...       290       291  \\\n",
       "country   -0.008545 -0.186523  0.045898 -0.081543  ... -0.145508  0.067383   \n",
       "city       0.071777  0.013306 -0.143555  0.011292  ...  0.024292 -0.168945   \n",
       "China      0.151367 -0.045654 -0.065430  0.034424  ...  0.140625  0.087402   \n",
       "Iraq       0.117188 -0.351562 -0.095215  0.200195  ... -0.100586 -0.077148   \n",
       "oil       -0.184570 -0.498047  0.047363  0.110840  ... -0.195312 -0.345703   \n",
       "town       0.039795 -0.196289 -0.039307  0.067871  ... -0.007935 -0.091797   \n",
       "Canada    -0.018677  0.006256  0.077637 -0.211914  ...  0.105469  0.030762   \n",
       "London    -0.251953 -0.055420  0.020020  0.149414  ... -0.008667 -0.008484   \n",
       "England   -0.062256 -0.202148  0.080566  0.021606  ...  0.135742  0.109375   \n",
       "Australia -0.164062 -0.269531  0.079102  0.275391  ...  0.021118  0.171875   \n",
       "\n",
       "                292       293       294       295       296       297  \\\n",
       "country   -0.244141 -0.077148  0.047607 -0.075195 -0.149414 -0.044189   \n",
       "city      -0.062988  0.117188 -0.020508  0.030273 -0.247070 -0.122559   \n",
       "China      0.152344  0.079590  0.006348 -0.037842 -0.183594  0.137695   \n",
       "Iraq      -0.123047  0.193359 -0.153320  0.089355 -0.173828 -0.054688   \n",
       "oil        0.217773 -0.091797  0.051025  0.061279  0.194336  0.204102   \n",
       "town      -0.265625  0.029297  0.089844 -0.049805 -0.202148 -0.079590   \n",
       "Canada    -0.039307  0.183594 -0.117676  0.191406  0.074219  0.020996   \n",
       "London    -0.053223  0.197266 -0.296875  0.064453  0.091797  0.058350   \n",
       "England   -0.121582  0.008545 -0.171875  0.086914  0.070312  0.003281   \n",
       "Australia  0.042236  0.221680 -0.239258 -0.106934  0.030884  0.006622   \n",
       "\n",
       "                298       299  \n",
       "country    0.097168  0.067383  \n",
       "city       0.076172 -0.234375  \n",
       "China      0.093750 -0.079590  \n",
       "Iraq       0.302734  0.105957  \n",
       "oil        0.235352 -0.051025  \n",
       "town       0.068848 -0.164062  \n",
       "Canada     0.285156 -0.257812  \n",
       "London     0.022583 -0.101074  \n",
       "England    0.069336  0.056152  \n",
       "Australia  0.051270 -0.135742  \n",
       "\n",
       "[10 rows x 300 columns]"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Print some rows of the embedding as a Dataframe\n",
    "embedding.head(10)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now let us find the name that corresponds to our numerical country:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'Spain'"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "find_closest_word(country)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Predicting other Countries"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'Spain'"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "find_closest_word(vec('Italy') - vec('Rome') + vec('Madrid'))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Germany\n",
      "China\n"
     ]
    }
   ],
   "source": [
    "print(find_closest_word(vec('Berlin') + capital))\n",
    "print(find_closest_word(vec('Beijing') + capital))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "However, it does not always work."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Lisbon\n"
     ]
    }
   ],
   "source": [
    "print(find_closest_word(vec('Lisbon') + capital))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Represent a sentence as a vector\n",
    "\n",
    "A whole sentence can be represented as a vector by summing all the word vectors that conform to the sentence. Let us see. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 2.87475586e-02,  1.03759766e-01,  1.32629395e-01,  3.33007812e-01,\n",
       "       -2.61230469e-02, -5.95703125e-01, -1.25976562e-01, -1.01306152e+00,\n",
       "       -2.18544006e-01,  6.60705566e-01, -2.58300781e-01, -2.09960938e-02,\n",
       "       -7.71484375e-02, -3.07128906e-01, -5.94726562e-01,  2.00561523e-01,\n",
       "       -1.04980469e-02, -1.10748291e-01,  4.82177734e-02,  6.38977051e-01,\n",
       "        2.36083984e-01, -2.69775391e-01,  3.90625000e-02,  4.16503906e-01,\n",
       "        2.83416748e-01, -7.25097656e-02, -3.12988281e-01,  1.05712891e-01,\n",
       "        3.22265625e-02,  2.38403320e-01,  3.88183594e-01, -7.51953125e-02,\n",
       "       -1.26281738e-01,  6.60644531e-01, -7.89794922e-01, -7.04345703e-02,\n",
       "       -1.14379883e-01, -4.78515625e-02,  4.76318359e-01,  5.31127930e-01,\n",
       "        8.10546875e-02, -1.17553711e-01,  1.02050781e+00,  5.59814453e-01,\n",
       "       -1.17187500e-01,  1.21826172e-01, -5.51574707e-01,  1.44531250e-01,\n",
       "       -7.66113281e-01,  5.36102295e-01, -2.80029297e-01,  3.85986328e-01,\n",
       "       -2.39135742e-01, -2.86865234e-02, -5.10498047e-01,  2.59658813e-01,\n",
       "       -7.52929688e-01,  4.32128906e-02, -7.17773438e-02, -1.26708984e-01,\n",
       "        4.40673828e-02,  5.12939453e-01, -5.15808105e-01,  1.20117188e-01,\n",
       "       -5.52978516e-02, -3.92089844e-01, -3.15917969e-01,  1.57226562e-01,\n",
       "       -3.19702148e-01,  1.75170898e-01, -3.81835938e-01, -2.07031250e-01,\n",
       "       -4.72717285e-02, -2.79296875e-01, -3.29040527e-01, -1.69067383e-01,\n",
       "        1.61132812e-02,  1.71569824e-01,  5.73730469e-02, -2.44140625e-03,\n",
       "        8.34960938e-02, -1.58203125e-01, -3.10119629e-01,  5.28564453e-02,\n",
       "        8.60595703e-02,  5.12695312e-02, -7.22900391e-01,  4.97924805e-01,\n",
       "       -5.85937500e-03,  4.49951172e-01,  3.82446289e-01, -2.80029297e-01,\n",
       "       -3.28125000e-01, -6.27441406e-02, -4.81933594e-01,  1.93176270e-02,\n",
       "       -1.69326782e-01, -4.28649902e-01,  5.39062500e-01, -1.28417969e-01,\n",
       "       -8.83789062e-02,  5.13916016e-01,  9.13085938e-02, -1.60156250e-01,\n",
       "        6.86035156e-02, -9.74121094e-02, -3.70712280e-01, -3.27270508e-01,\n",
       "        1.77978516e-01, -4.65332031e-01,  1.70410156e-01,  9.08203125e-02,\n",
       "        2.76857376e-01, -1.69677734e-01,  3.27728271e-01, -3.12500000e-02,\n",
       "       -2.20809937e-01, -3.46679688e-01,  4.67407227e-01,  5.31860352e-01,\n",
       "       -1.30615234e-01, -2.36816406e-02, -6.56250000e-01, -5.79589844e-01,\n",
       "       -2.05810547e-01, -3.03222656e-01,  1.94259644e-01, -7.28515625e-01,\n",
       "       -4.92522240e-01, -5.37109375e-01, -3.47656250e-01,  1.08642578e-01,\n",
       "       -1.41601562e-01, -2.07031250e-01,  2.52441406e-01, -7.78808594e-02,\n",
       "       -5.02441406e-01,  1.53808594e-02,  8.64257812e-02,  2.59765625e-01,\n",
       "        6.64062500e-02, -7.12890625e-01, -1.45751953e-01,  7.56835938e-03,\n",
       "        4.87792969e-01,  1.39160156e-01,  1.15722656e-01,  1.28662109e-01,\n",
       "       -4.75585938e-01,  2.21191406e-01,  3.25317383e-01,  1.06323242e-01,\n",
       "       -6.11083984e-01, -3.59619141e-01,  6.54296875e-02, -2.41699219e-01,\n",
       "       -6.29882812e-02, -1.62109375e-01,  4.26269531e-01, -4.38354492e-01,\n",
       "        1.93725586e-01,  4.89562988e-01,  5.31494141e-01, -7.29370117e-02,\n",
       "        1.77246094e-01,  9.39941406e-02,  2.92236328e-01, -2.74047852e-01,\n",
       "        2.63366699e-02,  4.36035156e-01, -3.76953125e-01,  3.10546875e-01,\n",
       "        4.87304688e-01, -2.43041992e-01,  1.21612549e-02, -3.80371094e-01,\n",
       "        3.80493164e-01, -6.22436523e-01, -3.98071289e-01,  1.24206543e-01,\n",
       "       -8.20312500e-01, -2.72583008e-01, -6.21582031e-01, -4.87060547e-01,\n",
       "        3.06671143e-01, -2.61230469e-01,  5.12451172e-01,  5.55694580e-01,\n",
       "        5.66894531e-01,  7.33886719e-01, -1.75781250e-01,  4.13574219e-01,\n",
       "       -2.54272461e-01,  1.32507324e-01, -4.78515625e-01,  4.63256836e-01,\n",
       "       -6.21948242e-02, -1.80664062e-01, -5.46386719e-01, -6.31103516e-01,\n",
       "       -1.47949219e-01, -3.15185547e-01, -7.12890625e-02, -7.67578125e-01,\n",
       "        3.92272949e-01, -1.97753906e-01,  2.23144531e-01, -5.07324219e-01,\n",
       "        8.39843750e-02, -4.98657227e-02,  1.01074219e-01,  2.07885742e-01,\n",
       "       -2.77343750e-01,  1.03027344e-01, -1.38671875e-01,  2.87353516e-01,\n",
       "       -4.81895447e-01, -1.66748047e-01, -1.47277832e-01,  3.61633301e-01,\n",
       "        6.38504028e-02, -6.69189453e-01,  1.95312500e-03, -7.34375000e-01,\n",
       "       -1.28158569e-01,  9.76562500e-04, -7.08007812e-02,  3.72558594e-01,\n",
       "        8.31176758e-01,  5.94482422e-01,  5.37109375e-02, -3.00140381e-01,\n",
       "       -4.53857422e-01,  1.11511230e-01, -1.32812500e-01,  1.25732422e-01,\n",
       "        3.39843750e-01, -2.48352051e-01, -1.62353516e-02, -2.84667969e-01,\n",
       "        4.70703125e-01, -4.48242188e-01,  8.50753784e-02,  2.69042969e-01,\n",
       "        3.98254395e-03, -3.53759766e-01, -3.90625000e-02, -3.22753906e-01,\n",
       "       -6.90917969e-02, -4.13818359e-02,  1.35314941e-01, -8.50396156e-02,\n",
       "        1.28417969e-01,  6.15966797e-01,  3.55957031e-01, -6.05468750e-02,\n",
       "       -2.25463867e-01, -2.62207031e-01, -2.72949219e-01, -5.16113281e-01,\n",
       "        1.59179688e-01,  2.74902344e-01, -7.61718750e-02, -3.41796875e-03,\n",
       "        4.37500000e-01,  2.98583984e-01, -4.40795898e-01, -3.43261719e-01,\n",
       "        1.73583984e-01,  3.32092285e-01, -2.12646484e-01,  5.76171875e-01,\n",
       "        2.06787109e-01, -7.91015625e-02,  5.79695702e-02, -1.01806641e-01,\n",
       "       -7.06787109e-01, -3.40576172e-02, -4.11865234e-01,  9.82666016e-02,\n",
       "       -1.70410156e-01, -4.18212891e-01,  8.39233398e-01, -1.15722656e-01,\n",
       "        1.28173828e-01, -2.07763672e-01, -4.08203125e-01, -1.77612305e-01,\n",
       "        1.01196289e-01,  4.24072266e-01, -5.26428223e-02, -5.58593750e-01,\n",
       "        1.12304688e-02, -1.12060547e-01, -9.42382812e-02,  2.35595703e-02,\n",
       "       -3.92578125e-01, -7.12890625e-02,  5.69824219e-01,  9.81445312e-02],\n",
       "      dtype=float32)"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "doc = \"Spain petroleum city king\"\n",
    "vdoc = [vec(x) for x in doc.split(\" \")]\n",
    "doc2vec = np.sum(vdoc, axis = 0)\n",
    "doc2vec"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'petroleum'"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "find_closest_word(doc2vec)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Congratulations! You have finished the introduction to word embeddings manipulation!**"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.8"
  },
  "latex_envs": {
   "LaTeX_envs_menu_present": true,
   "autoclose": false,
   "autocomplete": true,
   "bibliofile": "biblio.bib",
   "cite_by": "apalike",
   "current_citInitial": 1,
   "eqLabelWithNumbers": true,
   "eqNumInitial": 1,
   "hotkeys": {
    "equation": "Ctrl-E",
    "itemize": "Ctrl-I"
   },
   "labels_anchors": false,
   "latex_user_defs": false,
   "report_style_numbering": false,
   "user_envs_cfg": false
  },
  "nbTranslate": {
   "displayLangs": [
    "*"
   ],
   "hotkey": "alt-t",
   "langInMainMenu": true,
   "sourceLang": "en",
   "targetLang": "fr",
   "useGoogleTranslate": true
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  },
  "varInspector": {
   "cols": {
    "lenName": 16,
    "lenType": 16,
    "lenVar": 40
   },
   "kernels_config": {
    "python": {
     "delete_cmd_postfix": "",
     "delete_cmd_prefix": "del ",
     "library": "var_list.py",
     "varRefreshCmd": "print(var_dic_list())"
    },
    "r": {
     "delete_cmd_postfix": ") ",
     "delete_cmd_prefix": "rm(",
     "library": "var_list.r",
     "varRefreshCmd": "cat(var_dic_list()) "
    }
   },
   "types_to_exclude": [
    "module",
    "function",
    "builtin_function_or_method",
    "instance",
    "_Feature"
   ],
   "window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
